package model.matrizes;

import java.util.Arrays;

public class MatrizBidimensional {
        
        private MatrizBidimensional() {} // classe estática
        
        public static void transposta(Object[][] matriz) {
                Object[][] copia = copiar(matriz);
                for (int i = 0; i<copia.length; i++) {
                        for (int j = 0; j<copia[0].length; j++) {
                                matriz[j][i] = copia[i][j];
                        }
                }
        }

        /**
         * Não copia os objetos internos, só a matriz.
         * 
         * @param matriz
         * @return
         */
        public static Object[][] copiar(Object[][] matriz) {
                Object[][] copia = new Object[matriz.length][matriz[0].length];
                for (int i = 0; i<matriz.length; i++) {
                        copia[i] = Arrays.copyOf(matriz[i], matriz.length);
                }
                return copia;
        }


        /**
         * Ultima coluna será a primeira, a penultima, a segunda e assim por diante.
         * 
         * @param matriz
         */
        public static void espelharColunas(Object[][] matriz) {
                transposta(matriz); // O(nm) -> n é número de linhas e m o de colunas.
                espelharLinhas(matriz); // O(m)
                transposta(matriz); // O(nm)
                // O(m(2n+1)) Poderia ser menos custoso, mas não é necessário otimizar agora.
        }
        
        /**
         * Ultima linha será a primeira, a penultima, a segunda e assim por diante.
         * 
         * @param matriz
         */
        public static void espelharLinhas(Object[][] matriz) {
                Object[][] copia = copiar(matriz);
                int linha_copia = 0;
                for (int i = matriz.length-1; i>=0; i--) {
                        linha_copia = matriz.length-1 - i;
                        for (int j = 0; j<matriz[0].length; j++) {
                                matriz[i][j] = copia[linha_copia][j];
                        }
                }
        }
        
}